#!/usr/bin/env python
# -*- coding:utf-8 -*-
import socket
import os
import hashlib

ip_port = ('127.0.0.1',9999)
sk = socket.socket()
sk.connect(ip_port)     #连接服务器
base_dir = 'F:\\'       #指定文件基本目录,有些文件字母的开头需要转义，为了拼接时避免错误，用\\

def FileMD5(file_path):         #md5验证函数
    with open(file_path,"rb")as f:
        md5obj=hashlib.md5()
        md5obj.update(f.read())
        hash=md5obj.hexdigest()
        return hash

def upload():
    sk.recv(1024)       #接收服务器的开始上传指令
    file_path=raw_input("file_path:")   #用户输入需要上传的文件路径和文件名
    file_name=os.path.basename(file_path)   #只获取文件名
    file_size=os.path.getsize(file_path)    #只获取文件大小
    sk.send('%s|%s' %(file_name,file_size)) #拼接成文件的信息并交给服务器
    sk.recv(1024)       #收到服务器发送的数据传输指令
    send_size=0         #设定一个发送数据的变量，以此判断接收数据的进度
    with open(file_path,"rb")as fr:     #读取文件发送给服务器
        flag=True
        while flag:
            if file_size-send_size<=1024:   #最后一次发送
                data=fr.read(file_size-send_size)
                flag=False
            else:
                data=fr.read(1024)      #每次发送1024字节
                send_size+=1024
            sk.send(data)
    sk.recv(1024)
    file_md5=FileMD5(file_path)     #开始md5验证
    sk.send(file_md5)
    res=sk.recv(1024)
    print res

def download():
    sk.recv(1024)   #接收服务器确认消息
    file_name=raw_input("Download file name:")
    sk.send(file_name)
    file_size=sk.recv(1024)
    sk.send("download start")
    recv_size=0
    file_path=os.path.join(base_dir,file_name)
    with open(file_path,"wb")as fw:     #创建下载的文件并写入数据
        while True:
            if int(file_size)>recv_size:
                data=sk.recv(1024)
                recv_size+=len(data)
                fw.write(data)
            else:
                break
    sk.send("download ok")
    file_md5=sk.recv(1024)
    download_file_md5=FileMD5(file_path)
    if file_md5==download_file_md5:     #与源文件MD5比对
        print "download success"
    else:
        os.remove(file_path)        #md5不对，删除文件
        print "download fail"

while True:
    select=raw_input("%s,%s,%s\n请选择："%("1--上传","2--下载","任意键--退出"))
    if select=='1':
        sk.send('upload')       #告诉服务器我的操作
        upload()
    elif select=='2':
        sk.send('download')
        download()
    else:
        break

sk.close()